package scr.hotel;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import scr.hibernate.InitSessionFactory;

public class Quarto {

	private String numero;
	private boolean ocupado;
	private boolean ausente;
	private boolean limpeza;
	private boolean manutencao;
	private boolean servicoDeQuarto;
	private boolean reservado;
	private boolean Npertube;
	private boolean recado;
	private String mensagem;
	private TipoDeQuarto tipoQuarto;
	private int id;
	private String cpfCliente;
	

	public String getCpfCliente() {
		return cpfCliente;
	}
	public void setCpfCliente(String cpfCliente) {
		this.cpfCliente = cpfCliente;
	}

	public TipoDeQuarto getTipoQuarto() {
		return tipoQuarto;
	}
	public void setTipoQuarto(TipoDeQuarto tipoQuarto) {
		this.tipoQuarto = tipoQuarto;
	}

	public Quarto(){}
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	
	public String getNumero() {
		return numero;
	}
	public void setNumero(String numero) {
		this.numero = numero;
	}

	public boolean isNpertube() {
		return Npertube;
	}

	public boolean getOcupado() {
		return ocupado;
	}

	public void setOcupado(boolean ocupado) {
		this.ocupado = ocupado;
	}

	public boolean getAusente() {
		return ausente;
	}

	public void setAusente(boolean ausente) {
		this.ausente = ausente;
	}

	public boolean getLimpeza() {
		return limpeza;
	}

	public void setLimpeza(boolean limpeza) {
		this.limpeza = limpeza;
	}

	public boolean getManutencao() {
		return manutencao;
	}

	public void setManutencao(boolean manutencao) {
		this.manutencao = manutencao;
	}

	public boolean getServicoDeQuarto() {
		return servicoDeQuarto;
	}

	public void setServicoDeQuarto(boolean servico) {
		servicoDeQuarto = servico;
	}

	public boolean getReservado() {
		return reservado;
	}

	public void setReservado(boolean reservado) {
		this.reservado = reservado;
	}

	public boolean getNaoPertube() {
		return Npertube;
	}

	public void setNpertube(boolean Npertube) {
		this.Npertube = Npertube;
	}

	public boolean getRecado() {
		return recado;
	}

	public void setRecado(boolean recado) {
		this.recado = recado;
	}

	public String getMensagem() {
		return mensagem;
	}

	public void setMensagem(String mensagem) {
		this.mensagem = mensagem;
	}

	public TipoDeQuarto getTipo() {
		return tipoQuarto;
	}

	public void setTipo(TipoDeQuarto tipo) {
		this.tipoQuarto = tipo;
	}
	
	public boolean atribuiNumero(String strNumero){			
			setNumero(strNumero);
			return true;
	}

	public static boolean saveQuarto(Quarto quarto) {
		Transaction tx = null;
		if ((Quarto.buscaPorNumero(quarto.numero)) != null || quarto.getTipo() == null ){
			return false;
		}
		Session session = InitSessionFactory.getInstance().getCurrentSession();
		try {
			tx = session.beginTransaction();

			session.save(quarto);

			tx.commit();
		} catch (HibernateException e) {
			e.printStackTrace();
			if (tx != null && tx.isActive())
				tx.rollback();
		}
		TipoDeQuarto.saveTipoDeQuarto(quarto.tipoQuarto);
		return true;
	}

	public static void deleteQuarto(Quarto quarto) {

		Transaction tx = null;
		Session session = InitSessionFactory.getInstance().getCurrentSession();
		try {
			tx = session.beginTransaction();
			session.delete(quarto);
			tx.commit();
		} catch (HibernateException e) {
			e.printStackTrace();
			if (tx != null && tx.isActive())
				tx.rollback();
		}
		TipoDeQuarto.deleteTipoDeQuarto(quarto.tipoQuarto);
	}

	@SuppressWarnings("unchecked")
	public static LinkedList listarQuartos() {
		Transaction tx = null;
		Session sessao = InitSessionFactory.getInstance().getCurrentSession();
		List quartos = null;
		try {
			tx = sessao.beginTransaction();
			quartos = sessao.createCriteria(Quarto.class)
			.addOrder(Order.asc("numero"))
			.list();

			tx.commit();
			for (Iterator iter = quartos.iterator(); iter.hasNext();) {
				Quarto element = (Quarto) iter.next();
				System.out.println(element + "\n");
				TipoDeQuarto.buscaTipoDeQuarto(element);
				System.out.println(element.tipoQuarto + "\n\n");
			}

		} catch (HibernateException e) {
			e.printStackTrace();
		}
		LinkedList linkedList = new LinkedList(quartos);
		return linkedList;

	}

	
	public static Quarto buscaPorNumero(String numero){
		Transaction tx = null;
		Session sessao = InitSessionFactory.getInstance().getCurrentSession();
		List quartos = null;
		Quarto quarto = null;
		try {
			tx = sessao.beginTransaction();
			quartos = sessao.createCriteria(Quarto.class)
			.add( Restrictions.like("numero", numero) )
			.list();
			
			tx.commit();
			
			if( quartos.isEmpty() ) return null;
			quarto = (Quarto)quartos.get(0);
			TipoDeQuarto.buscaTipoDeQuarto(quarto);
			
	
		} catch (HibernateException e) {
			e.printStackTrace();
		}
		return quarto;
	}
	
	public static LinkedList buscaQuarto(TipoDeQuarto tipo){
		Transaction tx = null;
		Session sessao = InitSessionFactory.getInstance().getCurrentSession();
		List quartos = null;
		Quarto quarto = null;
//		LinkedList<Quarto> lista = null;
		
		try {
			tx = sessao.beginTransaction();
			quartos = sessao.createCriteria(Quarto.class)
			.addOrder( Order.asc("numero") )
			.list();
			
			tx.commit();
			
			if( quartos.isEmpty() ) return null;
			LinkedList lista = new LinkedList(quartos);
			for (Iterator iter = quartos.iterator(); iter.hasNext();) {
				quarto = (Quarto) iter.next();
				TipoDeQuarto.buscaTipoDeQuarto(quarto);
				if( (quarto.getTipo().getNcamas() != tipo.getNcamas())
						|| (quarto.getTipo().getNcamas() != tipo.getNcamas())
						|| (quarto.getTipo().getNcamas() != tipo.getNcamas()) )
				{
					lista.remove(quarto);
				}
			}
			return lista;
		} catch (HibernateException e) {
			e.printStackTrace();
		}
	
		return null;
	}
	
	public static boolean atualizar(Quarto quarto)
	{
		Transaction tx = null;
		Quarto element = null;
		Session sessao = InitSessionFactory.getInstance().getCurrentSession();

		try {
			tx = sessao.beginTransaction();
			List quartos = sessao.createCriteria(Quarto.class)
			.add( Restrictions.like("numero", quarto.numero) )
			.list();
			
			tx.commit();
			
			if( quartos.isEmpty() ) return false;
			
			element = (Quarto)quartos.get(0);
			TipoDeQuarto.buscaTipoDeQuarto(element);
			Quarto.deleteQuarto(element);

			if (!Quarto.saveQuarto(quarto)) return false;
		
		} catch (HibernateException e) {
			e.printStackTrace();
		}

		return true;
	}

	public String toString(){
		return 	"numero: " + numero + " Servico: " + servicoDeQuarto;
	}
}
